home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / var / lib / dpkg / info / libc6.preinst < prev    next >
Text File  |  2008-09-29  |  16KB  |  413 lines

  1. #!/bin/sh
  2. set -e
  3. export LC_ALL=C
  4.  
  5. type=$1
  6. preversion=$2
  7.  
  8. if [ "$type" = upgrade ]
  9. then
  10.     # Load debconf module if available
  11.     if [ -f /usr/share/debconf/confmodule ] ; then
  12.         . /usr/share/debconf/confmodule
  13.     fi
  14.  
  15.     if [ -n "$preversion" ]; then
  16.     # NSS authentication trouble guard
  17.     if dpkg --compare-versions "$preversion" lt 2.6-1; then
  18.  
  19.         check="gdm kdm proftpd postgresql xscreensaver xdm"
  20.         # NSS services check: NSS_CHECK
  21.         echo -n "Checking for services that may need to be restarted..."
  22.         # Only get the ones that are installed, and configured
  23.         check=$(dpkg -s $check 2> /dev/null | egrep '^Package:|^Status:' | awk '{if ($1 ~ /^Package:/) { package=$2 } else if ($0 ~ /^Status: .* installed$/) { print package }}')
  24.         # some init scripts don't match the package names
  25.         check=$(echo $check | \
  26.                 sed -e's/\bapache2-common\b/apache2/g' \
  27.                     -e's/\bat\b/atd/g' \
  28.                     -e's/\bdovecot-common\b/dovecot/g' \
  29.                     -e's/\bexim4-base\b/exim4/g' \
  30.                     -e's/\blpr\b/lpd/g' \
  31.                     -e's/\blpr-ppd\b/lpd-ppd/g' \
  32.                     -e's/\bsasl2-bin\b/saslauthd/g' \
  33.         )
  34.         echo
  35.         echo "Checking init scripts..."
  36.         rl=$(runlevel | sed 's/.*\ //')
  37.         for service in $check; do
  38.             if [ -x "`which invoke-rc.d 2>/dev/null`" ]; then
  39.                 idl=$(ls /etc/init.d/${service} 2> /dev/null | head -n 1)
  40.                 if [ -n "$idl" ] && [ -x $idl ]; then
  41.                     services="$service $services"
  42.                 else
  43.                     echo "WARNING: init script for $service not found."
  44.                 fi
  45.             else
  46.                 if [ -f /usr/share/file-rc/rc ] || [ -f /usr/lib/file-rc/rc ] && [ -f /etc/runlevel.conf ]; then
  47.                     idl=$(filerc $rl $service)
  48.                 else
  49.                     idl=$(ls /etc/rc${rl}.d/S??${service} 2> /dev/null | head -1)
  50.                 fi
  51.                 if [ -n "$idl" ] && [ -x $idl ]; then
  52.                     services="$service $services"
  53.                 fi
  54.             fi
  55.         done
  56.         if [ -n "$services" ]; then 
  57.         if [ -f /usr/share/debconf/confmodule ] ; then
  58.                 db_version 2.0
  59.             db_reset glibc/upgrade
  60.             db_subst glibc/upgrade services $services
  61.             if [ "$RELEASE_UPGRADE_MODE" = desktop ]; then
  62.             db_input medium glibc/upgrade || true
  63.             else
  64.             db_input critical glibc/upgrade || true
  65.             fi
  66.             db_go || true
  67.             db_get glibc/upgrade
  68.             answer=$RET
  69.         else
  70.             echo "Name Service Switch update in the GNU C Library"
  71.             echo
  72.             echo "Running services and programs that are using NSS need to be restarted,"
  73.             echo "otherwise they might not be able to do lookup or authentication any more."
  74.             echo "The installation process is able to restart some services (such as ssh or"
  75.             echo "telnetd), but other programs cannot be restarted automatically.  One such"
  76.             echo "program that needs manual stopping and restart after the glibc upgrade by"
  77.             echo "yourself is xdm - because automatic restart might disconnect your active"
  78.             echo "X11 sessions."
  79.             echo
  80.             echo "This script detected the following installed services which must be"
  81.             echo "stopped before the upgrade: $services"
  82.             echo
  83.             echo "If you want to interrupt the upgrade now and continue later, please"
  84.             echo "answer No to the question below."
  85.             echo 
  86.             frontend=`echo "$DEBIAN_FRONTEND" | tr '[:upper:]' '[:lower:]'`
  87.             if [ "$frontend" = noninteractive ]; then
  88.             echo "Non-interactive mode, upgrade glibc forcibly"
  89.             answer=true
  90.             else
  91.                 echo -n "Do you want to upgrade glibc now? [Y/n] "
  92.                 read answer
  93.                 case $answer in
  94.                 Y*|y*) answer=true ;;
  95.                 N*|n*) answer=false ;;
  96.                 *) answer=true ;;
  97.             esac
  98.             fi
  99.             echo
  100.         fi
  101.  
  102.         if [ "x$answer" != "xtrue" ]; then
  103.                 echo "Stopped glibc upgrade.  Please retry the upgrade after you have"
  104.                 echo "checked or stopped services by hand."
  105.                 exit 1
  106.         fi
  107.         fi
  108.     fi # end upgrading and $preversion lt 2.6-1
  109.     fi # Upgrading
  110.  
  111.     # This will keep us from using hwcap libs (optimized) during an
  112.     # upgrade.
  113.     touch /etc/ld.so.nohwcap
  114. fi
  115.  
  116. # Sanity check.
  117. # If there are versions of glibc outside of the normal installation
  118. # location (/lib, /lib64, etc.) then things may break very badly
  119. # as soon as ld.so is replaced by a new version.  This check is not
  120. # foolproof, but it's pretty accurate.  This script ignores libraries
  121. # with different sonames, and libraries incompatible with the 
  122. # to-be-installed ld.so.
  123.  
  124. check_dirs () {
  125.   for dir in $*; do
  126.     # Follow symlinks
  127.     dirlink=$(readlink -e $dir)
  128.     [ -n "$dirlink" ] && dir=$dirlink 
  129.     
  130.     # Handle /lib in LD_LIBRARY_PATH.
  131.     if expr $dir : "/lib.*" > /dev/null; then
  132.       continue
  133.     fi
  134.     # Skip ia32-libs package on ia64, and similar libraries
  135.     # (not sure why these get added to /etc/ld.so.conf)
  136.     if expr $dir : "/emul/.*" > /dev/null; then
  137.       continue
  138.     fi
  139.     if test -d $dir; then
  140.       output=$(ls $dir | egrep '^(libc.so.6|libm.so.6|libpthread.so.0|librt.so.1|libdl.so.2)$' 2>/dev/null)
  141.  
  142.       if test -n "$output"; then
  143.     # See if the found libraries are compatible with the system ld.so;
  144.     # if they aren't, they'll be ignored.  Check e_ident, e_type (which
  145.     # will just be ET_DYN), and e_machine.  If a match is found, there
  146.     # is a risk of breakage.
  147.     for lib in $output
  148.     do
  149.       if test -f "$dir/$lib"; then
  150.         libbytes=`head -c 20 $dir/$lib | od -c`
  151.         if test "$ldbytes" = "$libbytes"; then
  152.           echo "Matching libraries: $dir/$lib"
  153.           return 0
  154.         fi
  155.       fi
  156.     done
  157.       fi
  158.     fi
  159.   done
  160.   return 1
  161. }
  162.  
  163. if [ "$type" != abort-upgrade ]
  164. then
  165.   ldbytes=`head -c 20 /lib/ld-linux.so.2 | od -c`
  166.   dirs="/lib32 /lib64 /usr/local/lib /usr/local/lib32 /usr/local/lib64"
  167.   if ! test -L /usr; then
  168.     dirs="$dirs /usr/lib /usr/lib32 /usr/lib64"
  169.   fi
  170.   if check_dirs $dirs; then
  171.     echo
  172.     echo "A copy of glibc was found in an unexpected directory."
  173.     echo "It is not safe to upgrade the C library in this situation;"
  174.     echo "please remove that copy of the C library and try again."
  175.     echo "Please check: https://launchpad.net/bugs/81125"
  176.   fi
  177.  
  178.   if test -n "$LD_LIBRARY_PATH"; then
  179.     dirs=$(echo $LD_LIBRARY_PATH | sed 's/:/ /')
  180.     if check_dirs $dirs; then
  181.       echo
  182.       echo "Another copy of the C library was found via LD_LIBRARY_PATH."
  183.       echo "It is not safe to upgrade the C library in this situation;"
  184.       echo "please remove the directory from LD_LIBRARY_PATH and try again."
  185.       echo "Please check: https://launchpad.net/bugs/81125"
  186.     fi
  187.   fi
  188.   if test -e /etc/ld.so.conf; then
  189.     dirs=$(echo $(cat /etc/ld.so.conf))
  190.     if check_dirs $dirs; then
  191.       echo
  192.       echo "Another copy of the C library was found via /etc/ld.so.conf."
  193.       echo "It is not safe to upgrade the C library in this situation;"
  194.       echo "please remove the directory from /etc/ld.so.conf and try again."
  195.       echo "Please check: https://launchpad.net/bugs/81125"
  196.     fi
  197.   fi
  198.   for i in ld-2.3.2.so libc-2.3.2.so ld-2.3.6.so libc-2.3.6.so ; do
  199.     if [ -e /lib/tls/$i ] && ! dpkg-query -L libc6 2>/dev/null | grep -q /lib/tls/$i ; then
  200.       echo
  201.       echo "A non-dpkg owned copy of the C library was found in /lib/tls."
  202.       echo "It is not safe to upgrade the C library in this situation;"
  203.       echo "please remove that copy of the C library and try again."
  204.       exit 1
  205.     fi
  206.   done
  207.   if [ -e /lib/tls/i686/cmov/libc.so.6 ] || [ -e /lib/i686/cmov/libc.so.6 ] ; then
  208.     status_i686=$(dpkg -s libc6-i686 2>/dev/null | grep ^Status: | sed -e 's/^Status: \(.*\) \(.*\) \(.*\)/\3/g')
  209.     status_xen=$(dpkg -s libc6-xen 2>/dev/null | grep ^Status: | sed -e 's/^Status: \(.*\) \(.*\) \(.*\)/\3/g')
  210.     if ([ -z "$status_i686" ] || [ "$status_i686" = "not-installed" ] || [ "$status_i686" = "config-files" ]) && \
  211.        ([ -z "$status_xen" ] || [ "$status_xen" = "not-installed" ] || [ "$status_xen" = "config-files" ]); then
  212.       echo
  213.       echo "A non-dpkg owned copy of the libc6-i686 package was found."
  214.       echo "It is not safe to upgrade the C library in this situation;"
  215.       echo "please remove that copy of the C library and try again."
  216.       exit 1
  217.     fi
  218.   fi
  219.   if [ -n "$LD_ASSUME_KERNEL" ] ; then
  220.     if dpkg --compare-versions "$LD_ASSUME_KERNEL" le "2.6.1"; then
  221.       echo
  222.       echo "POSIX threads library NPTL requires kernel version 2.6.1"
  223.       echo "or later.  It appears that LD_ASSUME_KERNEL is set to $LD_ASSUME_KERNEL."
  224.       echo "It is not safe to upgrade the C library in this situation;"
  225.       echo "Please unset this environment variable and try again."
  226.       exit 1
  227.     fi
  228.   fi
  229. fi
  230.  
  231. if [ "$type" != abort-upgrade ]
  232. then
  233.     # glibc kernel version check: KERNEL_VERSION_CHECK
  234. linux_compare_versions () {
  235.     verA=$(($(echo "$1" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1 \* 10000 + \2 \* 100 + \3/')))
  236.     verB=$(($(echo "$3" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1 \* 10000 + \2 \* 100 + \3/')))
  237.  
  238.     test $verA -$2 $verB
  239. }
  240.  
  241. kfreebsd_compare_versions () {
  242.     verA=$(($(echo "$1" | sed 's/\([0-9]*\)\.\([0-9]*\).*/\1 \* 100 + \2/')))
  243.     verB=$(($(echo "$3" | sed 's/\([0-9]*\)\.\([0-9]*\).*/\1 \* 100 + \2/')))
  244.  
  245.     test $verA -$2 $verB
  246. }
  247.  
  248. kernel26_help() {
  249.     echo ""
  250.     echo "The installation of a 2.6 kernel _could_ ask you to install a new libc"
  251.     echo "first, this is NOT a bug, and should *NOT* be reported. In that case,"
  252.     echo "please add etch sources to your /etc/apt/sources.list and run:"
  253.     echo "  apt-get install -t etch linux-image-2.6"
  254.     echo "Then reboot into this new kernel, and proceed with your upgrade"
  255. }
  256.  
  257. exit_check () {
  258.     
  259.     exit 1
  260. }
  261.  
  262.     system=`uname -s`
  263.     if [ "$system" = "Linux" ]
  264.     then
  265.         # Test to make sure z < 255, in x.y.z-n form of kernel version
  266.         # Also make sure we don't trip on x.y.zFOO-n form
  267.         #kernel_rev=$(uname -r | tr -- - . | cut -d. -f3 | tr -d '[:alpha:]')
  268.         kernel_rev=$(uname -r | sed 's/\([0-9]*\.[0-9]*\.\)\([0-9]*\)\(.*\)/\2/')
  269.         if [ "$kernel_rev" -ge 255 ]
  270.         then
  271.             echo "WARNING: Your kernel version indicates a revision number"
  272.             echo "of 255 or greater.  Glibc has a number of built in"
  273.             echo "assumptions that this revision number is less than 255."
  274.             echo "If you\'ve built your own kernel, please make sure that any"
  275.             echo "custom version numbers are appended to the upstream"
  276.             echo "kernel number with a dash or some other delimiter."
  277.  
  278.             exit_check
  279.         fi
  280.  
  281.         # sanity checking for the appropriate kernel on each architecture.
  282.         realarch=`uname -m`
  283.         kernel_ver=`uname -r`
  284.  
  285.         # convert "armv4l" and similar to just "arm", and "mips64" and similar
  286.         # to just "mips"
  287.         case $realarch in
  288.           arm*) realarch="arm";;
  289.           mips*) realarch="mips";;
  290.         esac
  291.  
  292.  
  293.         # From glibc 2.3.5-7 real-i386 is dropped.
  294.         if [ "$realarch" = i386 ]
  295.         then
  296.             echo "WARNING: This machine has real i386 class processor."
  297.             echo "Debian etch and later does not support such old hardware"
  298.             echo "any longer."
  299.             echo "The reason is that \"bswap\" instruction is not supported"
  300.             echo "on i386 class processors, and some core libraries have"
  301.             echo "such instruction.  You\'ll see illegal instruction error"
  302.             echo "when you upgrade your Debian system."
  303.             exit_check
  304.         fi
  305.  
  306.         # arm boxes require __ARM_NR_set_tls in the kernel to function properly.
  307.         if [ "$realarch" = arm ]
  308.         then
  309.             if linux_compare_versions "$kernel_ver" lt 2.6.12
  310.             then
  311.                 echo WARNING: This version of glibc requires that you be running
  312.                 echo kernel version 2.6.12 or later.  Earlier kernels contained
  313.                 echo bugs that may render the system unusable if a modern version
  314.                 echo of glibc is installed.
  315.                 kernel26_help
  316.                 exit_check
  317.             fi    
  318.         fi
  319.  
  320.         # Alpha and HPPA boxes require latest fixes in the kernel to function properly.
  321.         if [ "$realarch" = parisc -o "$realarch" = alpha ]
  322.         then
  323.             if linux_compare_versions "$kernel_ver" lt 2.6.9
  324.             then
  325.                 echo WARNING: This version of glibc requires that you be running
  326.                 echo kernel version 2.6.9 or later.  Earlier kernels contained
  327.                 echo bugs that may render the system unusable if a modern version
  328.                 echo of glibc is installed.
  329.                 kernel26_help
  330.                 exit_check
  331.             fi
  332.         fi
  333.  
  334.         # sh4 boxes require kernel version 2.6.11 minimum
  335.         if [ "$realarch" = sh4 ]
  336.         then
  337.             if linux_compare_versions "$kernel_ver" lt 2.6.11
  338.             then
  339.                 echo WARNING: This version of glibc requires that you be running
  340.                 echo kernel version 2.6.11 or later.  Earlier kernels contained
  341.                 echo bugs that may render the system unusable if a modern version
  342.                 echo of glibc is installed.
  343.                 kernel26_help
  344.                 exit_check
  345.             fi    
  346.         fi
  347.  
  348.         # The GNU libc requires 2.6 kernel (except on m68k) because we drop to
  349.         # support linuxthreads
  350.         if [ "$realarch" != m68k ]
  351.         then
  352.             if linux_compare_versions "$kernel_ver" lt 2.6.8
  353.             then
  354.                 echo WARNING: POSIX threads library NPTL requires kernel version
  355.                 echo 2.6.8 or later.  If you use a kernel 2.4, please upgrade it
  356.                 echo before installing glibc.
  357.                 kernel26_help
  358.                 exit_check
  359.             fi
  360.         fi
  361.  
  362.         # The GNU libc is now built with --with-kernel= >= 2.4.1 on m68k
  363.         if [ "$realarch" = m68k ]
  364.         then
  365.             if linux_compare_versions "$kernel_ver" lt 2.4.1
  366.             then
  367.                 echo WARNING: This version of glibc requires that you be running
  368.                 echo kernel version 2.4.1 or later.  Earlier kernels contained
  369.                 echo bugs that may render the system unusable if a modern version
  370.                 echo of glibc is installed.
  371.                 kernel26_help
  372.                 exit_check
  373.             fi
  374.         fi
  375.  
  376.         # From glibc 2.6-3 SPARC V8 support is dropped.
  377.         if [ "$realarch" = sparc ]
  378.         then
  379.             # The process could be run using linux32, check for /proc.
  380.             if [ -f /proc/cpuinfo ]
  381.             then
  382.                case "$(sed '/^type/!d;s/^type.*: //g' /proc/cpuinfo)" in
  383.                    sun4u)
  384.                       # UltraSPARC CPU
  385.                       ;;
  386.                    sun4v)
  387.                       # Niagara CPU
  388.                       ;;
  389.                    *)
  390.                       echo "WARNING: This machine has a SPARC V8 or earlier class processor."
  391.                       echo "Debian lenny and later does not support such old hardware"
  392.                       echo "any longer."
  393.                       exit_check
  394.                       ;;
  395.                esac
  396.             fi
  397.         fi
  398.     elif [ $system = "GNU/kFreeBSD" ] ; then
  399.         kernel_ver=`uname -r`
  400.         if kfreebsd_compare_versions "$kernel_ver" lt 6.0
  401.         then
  402.             echo WARNING: This version of glibc uses UMTX_OP_WAIT and UMTX_OP_WAKE
  403.         echo syscalls that are not present in the current running kernel. They
  404.         echo have been added in kFreeBSD 6.0.  Your system should still work,
  405.         echo but it is recommended to upgrade to a more recent version.
  406.         fi
  407.     fi
  408. fi
  409.  
  410.  
  411.  
  412. exit 0
  413.